Beispiel #1
0
        public void TestObjectParsing()
        {
            var sourceList = new List <string> {
                ObjectContent
            };
            var streamer = TokenStreamer.CreateFromList(sourceList);

            // Read object id
            var currentToken = Token.EOL;

            while (currentToken.Type != TokenType.Id)
            {
                currentToken = streamer.GetNextToken();
            }

            Assert.Equal("obj", currentToken.Value as string);

            // Read attribute dict
            var attribParser  = new ObjectParser(streamer);
            var parsedAttribs = attribParser.ReadSingleObject() as PdfDictionary;

            Assert.Equal(804, (int)(parsedAttribs["Length"] as PdfAtom).AsNumber());

            // Read body stream start token
            var streamStartToken = streamer.GetNextToken();

            Assert.Equal("stream", streamStartToken.Value as string);
        }
Beispiel #2
0
        private void ParseConversionTables(IList <string> objContents)
        {
            var parser = new ObjectParser(TokenStreamer.CreateFromList(objContents));

            PdfAtom command;
            var     paramList = new List <IPdfTerm>();

            do
            {
                command = parser.ReadNextCommand(paramList);

                switch (command?.AsString())
                {
                case CodeSpaceSectionEnd:
                    CheckSidSize(paramList);
                    break;

                case BfCharSectionEnd:
                    FillSidToCharMap(paramList);
                    break;

                case BfRangeSectionEnd:
                    FillSidToCharMapFromRanges(paramList);
                    break;
                }

                paramList.Clear();
            }while(command != null);
        }
Beispiel #3
0
        public void TestObjectWithComplexStringParsing()
        {
            var sourceList = new List <string> {
                ObjectWithComplexString
            };
            var parser = new ObjectParser(TokenStreamer.CreateFromList(sourceList));

            var parsedObj = parser.ReadSingleObject() as PdfArray;

            Assert.Equal(4, parsedObj.Count);
        }
Beispiel #4
0
        public void TestParseComplexAttribs()
        {
            using var linesReader = CreateStringReader(ComplexString);
            var streamer     = TokenStreamer.CreateFromReader(linesReader);
            var attribParser = new ObjectParser(streamer);

            var attribDict = attribParser.ReadSingleObject();

            Assert.IsType <PdfDictionary>(attribDict);

            var nextTerm = attribParser.ReadSingleObject();

            Assert.Null(nextTerm);
        }
Beispiel #5
0
        public void TestObjectTermsParsing()
        {
            var sourceList = new List <string>(ComplexObjectContent.Split("\r\n"));
            var streamer   = TokenStreamer.CreateFromList(sourceList);
            var parser     = new ObjectParser(streamer);

            IPdfTerm term = parser.ReadSingleObject();

            Assert.IsType <PdfArray>(term);

            var firstArrayElement = (term as PdfArray)[0];

            Assert.IsType <PdfDictionary>(firstArrayElement);
        }
Beispiel #6
0
        public void TestParseBasicAttribs()
        {
            const string CompressionAttrib = "Filter";

            using var linesReader = CreateStringReader(BasicString);
            var streamer     = TokenStreamer.CreateFromReader(linesReader);
            var attribParser = new ObjectParser(streamer);

            var attribs = attribParser.ReadSingleObject() as PdfDictionary;

            Assert.Contains(CompressionAttrib, attribs.Keys);

            var nextToken = attribParser.ReadSingleObject();

            Assert.Null(nextToken);
        }
        public void TestContinuousParsing()
        {
            const int NumTokensInTestString = 35;

            using var contentReader = CreateStringReader(ObjectContent);
            var streamer = TokenStreamer.CreateFromReader(contentReader);

            Token currentToken;
            int   numTokensRead = 0;

            do
            {
                currentToken = streamer.GetNextToken();
                numTokensRead++;
            }while(currentToken.Type != TokenType.End);

            Assert.True(streamer.AtEndOfStream);
            Assert.Equal(NumTokensInTestString, numTokensRead - 1);
        }
Beispiel #8
0
        private void ExtractTextFromPage(PdfPage page)
        {
            var streamer = TokenStreamer.CreateFromList(page.RawContent);
            var parser   = new ObjectParser(streamer);

            PdfAtom command;
            var     paramList = new List <IPdfTerm>();

            do
            {
                command = parser.ReadNextCommand(paramList);

                if (command != null)
                {
                    InterpretPdfCommand(command.AsString(), paramList);
                }

                paramList.Clear();
            }while(command != null);
        }
Beispiel #9
0
        public void TestAllTermsParsing()
        {
            var sourceList = new List <string> {
                ObjectContent
            };
            var streamer = TokenStreamer.CreateFromList(sourceList);
            var parser   = new ObjectParser(streamer);

            var      allTerms = new List <IPdfTerm>();
            IPdfTerm parsedTerm;

            do
            {
                parsedTerm = parser.ReadSingleObject();
                if (parsedTerm != null)
                {
                    allTerms.Add(parsedTerm);
                }
            }while(parsedTerm != null);

            Assert.Null(parsedTerm);
            Assert.Equal(5, allTerms.Count);
        }
Beispiel #10
0
        private async Task InsideRun()
        {
            bool NotExit = true;

            //Thread safe Heap ??
            //EDIT: Maybe it is an 'Object pool"!

            var Pool = new ObjectPool();

            var binderService = new BinderService();

            #region Eval Loop

            while (NotExit && !ForceGlobalExit)
            {
                var line = reader();

                if (!string.IsNullOrEmpty(line))
                {
                    var input = TokenStreamer.MakeTokenInput(line);

                    var stream = input.GetStream();

                    //check logger
                    //stream.GetStringsRepresentation().Project(sr => string.Format("check: {0}", sr)).Project(writer);

                    if (!input.IsCommandInput)
                    {
                        writer("Command inexistent");
                    }
                    else
                    {
                        switch (input.Command)
                        {
                        //Review this functionality, now it writes the result but doesnt handle very good the arguments !
                        case Command.Call:

                            #region Call Implementation

                            var com2 = new CallCommandable(stream, 1);

                            try
                            {
                                var result = await binderService.DynamicGenInvokeFunc(com2.LookUpName, com2.Arguments);

                                writer(result);
                            }
                            catch (Exception ex)
                            {
                                writer(string.Format("Exception when called: ", com2.LookUpName));
                                writer(ex.ToString());
                            }

                            break;

                            #endregion

                        case Command.Seq:

                            #region Seq Implementation

                            var seqCom = new SeqComandable(stream);

                            var runners = seqCom.PipeCommandables.Select(pc => new PipeRunner()
                            {
                                Pipe = pc, Binder = new BinderService()
                            });

                            var tasks = runners.Select(r => r.Run(Pool.GetAllocated));

                            await Task.WhenAll(tasks);

                            break;

                            #endregion

                        case Command.Pipe:

                            #region Pipe Implementation

                            var pipe = new PipeCommandable(stream);

                            var runner = new PipeRunner()
                            {
                                Pipe        = pipe,
                                Binder      = binderService,
                                OnException = (ex, lookup) => writer(string.Format("Action {0} failed with {1}", lookup, ex.ToString()))
                            };

                            await runner.Run(Pool.GetAllocated);

                            break;

                            #endregion

                        case Command.Types:

                            #region DEPRECATED

                            //TODO: ENHANCE THE TO TYPE FOR A DYNAMIC WAY
                            //var callCom = new CallCommandable(stream, 0);

                            //var comodin = callCom.IsComodin();

                            //var invoc = Invocables.Value.Where(inv => comodin || callCom.Arguments.Contains(inv.Name.ToLower())).ToList();

                            //Action<Invocable> writer = i => new[] { "", i.ToString(), i.Binder.TypesToString() }.Enumerates(Console.WriteLine);

                            //invoc.ForEach(writer);

                            #endregion

                            break;

                        case Command.Var:

                            #region Var Implementation

                            var varCom = new VarCommandable(stream.PlainTokens);

                            var name = varCom.Name;

                            if (!varCom.IsVarNameConvention)
                            {
                                writer(string.Format("var name should start with: {0}", TokenConfigs.VarNameStart));
                                break;
                            }

                            if (Pool.IsAny(name))
                            {
                                writer(string.Format("'{0}' already defined", name));
                                break;
                            }
                            ;

                            var pipesAssign = new PipeCommandable(varCom.Statement);

                            var runnerVar = new PipeRunner()
                            {
                                Pipe        = pipesAssign,
                                Binder      = binderService,
                                OnException = (lookup, ex) => writer(string.Format("Action {0} failed with {1}", lookup, ex.ToString())),
                                OnValue     = val => Pool.TryAdd(name, val)
                            };

                            await runnerVar.Run(Pool.GetAllocated);

                            break;

                            #endregion

                        case Command.Heap:

                            #region Heap Implementation

                            var heapCom = new HeapCommandable(stream.PlainTokens);

                            switch (heapCom.Operator.ToLower())
                            {
                            case "clear":

                                Pool.Clear();
                                writer("Heap cleared");

                                break;

                            case "remove":

                                dynamic outVar;
                                var     dic = new Dictionary <string, bool>();

                                heapCom.Arguments.Enumerates(obj => {
                                    if (Pool.IsAny(obj))
                                    {
                                        dic.Add(obj, Pool.TryRemove(obj, out outVar));
                                    }
                                    else
                                    {
                                        writer(string.Format("'{0}' not defined", obj));
                                    }
                                });

                                dic.Enumerates(e => e.Value ? writer(string.Format("{0} removed", e.Key)) : writer(string.Format("error removing: {0} ", e.Key)));

                                break;

                            default:

                                if (Pool.IsAny())
                                {
                                    Pool.GetVars().Enumerates(k => writer(k.ToString()));
                                }
                                else
                                {
                                    writer("Heap is empty");
                                }

                                break;
                            }

                            break;

                            #endregion

                        case Command.Commands:

                            #region Commands Implementation

                            MyUtils.GetEnums <Command>().Select(e => e.ToString()).Enumerates(writer);

                            break;

                            #endregion

                        case Command.Clear:

                            //PENDING DEFINITION
                            Console.Clear();
                            break;

                        case Command.Exit:

                            #region Exit Command

                            writer("Press Y to exit");

                            if (reader().ToLower() == "y")
                            {
                                NotExit = false;
                            }

                            break;

                            #endregion

                        case Command.Invocables:

                            #region Implementation

                            var arg = stream.PlainTokens
                                      .Skip(1)
                                      .Where(t => !t.IsEmpty)
                                      .FirstOrDefault();

                            var filter = MyUtils.MakeFunc((string s) => true);

                            if (arg != null)
                            {
                                filter = s => s.IndexOf(arg.Value, StringComparison.InvariantCultureIgnoreCase) >= 0;
                            }

                            Reflector.GetAttributesInAssembly <InvokerAttributes.Invoker>()
                            .OrderBy(a => a.Name)
                            .Where(a => filter(a.Name))
                            .Aggregate(new StringBuilder(), (builder, a) => builder.AppendLine(string.Format(a.Description != null ? "{0}: {1}" : "{0}", a.Name, a.Description)))
                            .ToString()
                            .Project(writer);

                            #endregion

                            break;

                        default:

                            #region Default

                            var first = stream.PlainTokens.First();

                            //IsReserved word ?
                            //Is Var instance
                            if (Pool.IsCreated)
                            {
                                var reference = Pool.GetAllocated(first.Value);

                                if (Pool.IsAny(first.Value.ToLower()))
                                {
                                    writer(MyExtensions.ToNullString(reference));     //val.Value
                                }
                                else
                                {
                                    writer(string.Format("'{0}' is not defined", first.Value));
                                }
                            }

                            break;

                            #endregion
                        }
                    }
                }

                ForceGlobalExit = _force;
            }

            #endregion
        }