Maintain and add new SQL Procedures
This commit is contained in:
146
current/[FNDD_CONVERT_RTF2TEXT]/[FNDD_CONVERT_RTF2TEXT].sql
Normal file
146
current/[FNDD_CONVERT_RTF2TEXT]/[FNDD_CONVERT_RTF2TEXT].sql
Normal file
@@ -0,0 +1,146 @@
|
||||
SET ANSI_NULLS ON
|
||||
GO
|
||||
SET QUOTED_IDENTIFIER ON
|
||||
GO
|
||||
|
||||
-- [FNDD_CONVERT_RTF2Text]
|
||||
-- =================================================================
|
||||
-- Converts a RTF text to a regular text
|
||||
--
|
||||
-- Returns: NVARCHAR - text
|
||||
-- =================================================================
|
||||
-- Copyright (c) 2024 by Digital Data GmbH
|
||||
--
|
||||
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
|
||||
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
|
||||
-- =================================================================
|
||||
-- Creation Date / Author: 26.09.2024 / HE,MK
|
||||
-- Version Date / Editor: 14.12.2024 / HE,MK
|
||||
-- Version Number: 1.1.0.0
|
||||
-- =================================================================
|
||||
-- History:
|
||||
-- 26.09.2024 / HE,MK - First Version
|
||||
-- 14.12.2024 / MK - code optimisation, new additional parameters
|
||||
|
||||
CREATE OR ALTER FUNCTION [dbo].[FNDD_CONVERT_RTF2Text](
|
||||
@pRTF nvarchar(max), -- Give the RTF text, you want to convert
|
||||
@pREMOVE_LINE_WRAP BIT = 1, -- Set to 1 to remove line wraps
|
||||
@pREMOVE_DOUBLE_BLANKS BIT = 1 -- Set to 1 to remove unnecessary blanks
|
||||
)
|
||||
RETURNS nvarchar(max)
|
||||
AS
|
||||
BEGIN
|
||||
|
||||
-- decalare new vars because of parameter sniffing
|
||||
DECLARE @RTF NVARCHAR(256) = ISNULL(@pRTF,''),
|
||||
@REMOVE_LINE_WRAP BIT = ISNULL(@pREMOVE_LINE_WRAP,1),
|
||||
@REMOVE_DOUBLE_BLANKS BIT = ISNULL(@pREMOVE_DOUBLE_BLANKS,1);
|
||||
|
||||
-- decalare runtime vars
|
||||
DECLARE @Pos1 int,
|
||||
@Pos2 int,
|
||||
@hex varchar(316);
|
||||
|
||||
DECLARE @Stage table ([Char] char(1), [Pos] int);
|
||||
|
||||
IF (LEN(@RTF) > 1) BEGIN
|
||||
|
||||
INSERT @Stage ([Char], [Pos])
|
||||
|
||||
SELECT SUBSTRING(@rtf, [Number], 1),
|
||||
[Number]
|
||||
FROM [master]..[spt_values]
|
||||
WHERE ([Type] = 'p')
|
||||
AND (SUBSTRING(@rtf, Number, 1) IN ('{', '}'));
|
||||
|
||||
SELECT @Pos1 = MIN([Pos])
|
||||
, @Pos2 = MAX([Pos])
|
||||
FROM @Stage;
|
||||
|
||||
DELETE
|
||||
FROM @Stage
|
||||
WHERE ([Pos] IN (@Pos1, @Pos2));
|
||||
|
||||
WHILE (1 = 1) BEGIN
|
||||
SELECT TOP 1 @Pos1 = s1.[Pos]
|
||||
, @Pos2 = s2.[Pos]
|
||||
FROM @Stage s1
|
||||
INNER JOIN @Stage s2 ON s2.[Pos] > s1.[Pos]
|
||||
WHERE (s1.[Char] = '{')
|
||||
AND (s2.[Char] = '}')
|
||||
ORDER BY s2.[Pos] - s1.[Pos];
|
||||
|
||||
IF @@ROWCOUNT = 0
|
||||
BREAK
|
||||
|
||||
DELETE
|
||||
FROM @Stage
|
||||
WHERE ([Pos] IN (@Pos1, @Pos2));
|
||||
|
||||
UPDATE @Stage
|
||||
SET [Pos] = [Pos] - @Pos2 + @Pos1 - 1
|
||||
WHERE ([Pos] > @Pos2);
|
||||
|
||||
SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '');
|
||||
END;
|
||||
|
||||
SET @rtf = REPLACE(@rtf, '\pard', '');
|
||||
SET @rtf = REPLACE(@rtf, '\par', '');
|
||||
SET @rtf = STUFF(@rtf, 1, CHARINDEX(' ', @rtf), '');
|
||||
|
||||
WHILE (Right(@rtf, 1) IN (' ', CHAR(13), CHAR(10), '}')) BEGIN
|
||||
SELECT @rtf = SUBSTRING(@rtf, 1, (LEN(@rtf + 'x') - 2));
|
||||
IF LEN(@rtf) = 0 BREAK
|
||||
END;
|
||||
|
||||
SET @Pos1 = CHARINDEX('\''', @rtf);
|
||||
|
||||
WHILE (@Pos1 > 0) BEGIN
|
||||
IF (@Pos1 > 0) BEGIN
|
||||
SET @hex = '0x' + SUBSTRING(@rtf, @Pos1 + 2, 2);
|
||||
SET @rtf = REPLACE(@rtf, SUBSTRING(@rtf, @Pos1, 4),CHAR(CONVERT(int, CONVERT (binary(1), @hex,1))));
|
||||
SET @Pos1 = CHARINDEX('\''', @rtf);
|
||||
END;
|
||||
END;
|
||||
|
||||
SET @rtf = @rtf + ' ';
|
||||
SET @Pos1 = PATINDEX('%\%[0123456789][\ ]%', @rtf);
|
||||
|
||||
WHILE (@Pos1 > 0) BEGIN
|
||||
|
||||
SET @Pos2 = CHARINDEX(' ', @rtf, @Pos1 + 1);
|
||||
|
||||
IF (@Pos2 < @Pos1) BEGIN
|
||||
SET @Pos2 = CHARINDEX('\', @rtf, @Pos1 + 1);
|
||||
END;
|
||||
|
||||
IF (@Pos2 < @Pos1) BEGIN
|
||||
SET @rtf = SUBSTRING(@rtf, 1, @Pos1 - 1);
|
||||
SET @Pos1 = 0;
|
||||
END; ELSE BEGIN
|
||||
SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '');
|
||||
SET @Pos1 = PATINDEX('%\%[0123456789][\ ]%', @rtf);
|
||||
END;
|
||||
END;
|
||||
|
||||
IF (@REMOVE_LINE_WRAP = 1) BEGIN
|
||||
SET @rtf = REPLACE(@rtf,char(10),' ');
|
||||
SET @rtf = REPLACE(@rtf,char(13),' ');
|
||||
END;
|
||||
|
||||
IF (@REMOVE_DOUBLE_BLANKS = 1) BEGIN
|
||||
WHILE (@rtf like '% %') BEGIN
|
||||
IF (@rtf like '% %') BEGIN
|
||||
SET @rtf = REPLACE(@rtf,' ',' ');
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
|
||||
-- Anyway remove trailing spaces
|
||||
SET @rtf = LTRIM(RTRIM(@rtf));
|
||||
|
||||
END;
|
||||
|
||||
RETURN @rtf;
|
||||
|
||||
END;
|
||||
Reference in New Issue
Block a user